package controllers.service;

import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;

import models.domain.ContractItem;
import models.persistence.JPAUtil;
import models.persistence.StaticQuerries;
import enumerators.ItemType;
import enumerators.Quantity;
import enumerators.Tables;

public class ManagePromotionsService {

	private EntityManager em;

	public ManagePromotionsService() {
		em = JPAUtil.createEntityManager();
	}

	/**
	 * Δημιουργεί ένα ContractItem
	 * 
	 * @param data
	 *            Τα στοιχεία του ContractItem
	 * @return Επιστρέφει το ContractItem
	 */
	private ContractItem createPromotion(Map<String, String> data) {
		try {
			ContractItem ci = new ContractItem();

			ci.setItemType(ItemType.valueOf(data.get("itemType")));
			ci.setQuantity(Quantity.valueOf(data.get("quantity")));
			ci.setAmount(Integer.valueOf(data.get("amount")));
			ci.setRate(Float.valueOf(data.get("rate")));

			return ci;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * Επιστρέφει όλα τα διαθέσιμα Promotions
	 * 
	 * @return A List with all the Contract Items
	 */
	@SuppressWarnings("unchecked")
	public List<ContractItem> getAvailablePromotions() {

		List<ContractItem> promotions = (List<ContractItem>) (Object)StaticQuerries.getAllItems(em, Tables.ContractItem);
		return promotions;
	}

	/**
	 * Ανακτά ένα Promotion από το id του
	 * 
	 * @param id
	 * @return ContractItem
	 */
	public ContractItem getPromotionById(int id) {

		ContractItem promotion = null;

		promotion = em.find(ContractItem.class, id);

		return promotion;
	}

	/**
	 * Προσθέτει ένα νέο Promotion
	 * 
	 * @param data
	 *            Τα στοιχεία του νέου Promotion
	 * @return Επιστρέφει το αποτέλεσμα σε boolean
	 */
	public boolean addPromotion(Map<String, String> data) {
		ContractItem ci = createPromotion(data);

		if (ci != null) {
			em.persist(ci);

			return true;
		}

		return false;
	}

	/**
	 * Αφαιρεί ένα Promotion
	 * 
	 * @param id
	 *            Το id του Promotion προς αφαίρεση
	 */
	public void removePromotion(int id) {

		ContractItem promotion = em.find(ContractItem.class, id);

		em.remove(promotion);

		em.flush();
	}
}
